05.12 일지
🎯 Fragment안에 Fragment 띄우기
Fragment in Fragment를 위한 과정
OuterFragment.kt
에서 FragmentManager
사용
childFragmentManager.beginTransaction()
OuterFragmentLayout.xml
에서 FrameLayout
자리마련
<FrameLayout />
OuterFragment.kt
에서 InnerFragment를 받아올 container = FrameLayout
관리
val container = root.findViewById<FrameLayout>(R.id.FRAME_LAYOUT)
InnerFragment의 화면이 상단 AppBar와 겹쳐서 위쪽이 잘리는 문제
: OuterFragment가 만들어내는 화면 내에서 AppBar와 InnerFragment가 중첩되지 않게 레이아웃이 차지하는 공간 구분이 명확해야함
OuterFragmentLayout.xml
레이아웃 파일에서 CoordinateLayout
→ LinearLayout
수정 후 문제해결
😞 CoordinateLayout은 정체가 뭔가..?
InnerFragment의 화면이 하단 NavigationBar와 여전히 겹치는 문제
why? NavigationBar는 현재 OuterFragment를 포함하는 상위 Activity에서 정의되므로 현재 파일의 레이아웃 변화로 해결할 수 없음
😞 ⇒ Activity의 레이아웃을 ConstraintLayout
→LinearLayout
바꾼다면?
⇒ 하단바 자체가 사라져버린다..
😀 ⇒ 어차피 스크롤 가능한 InnerFragment를 만드므로, InnerFragment를 담는 LinearLayout에 패딩 추가(아래 하단바 크기 만큼)
🎯 탭바를 눌렀을 때 탭에 맞는 페이지 띄우기
: "누름"이라는 이벤트를 다뤄야하므로 kt파일에서 다뤄진다.
사용할 TabLayout 객체로 받아오기
val tabLayout = root.findViewById<TabLayout>(R.id.TABS)
전에도 쓴 것 같지만 root는 FragmentBinding.inflate()로 만들어진 연관된 View의 모임이다.
Tab 이벤트 핸들링
tabLayout.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener{
override fun onTabUnselected(tab: TabLayout.Tab?) {}
override fun onTabSelected(tab: TabLayout.Tab?) {}
override fun onTabReselected(tab: TabLayout.Tab?) {}
})
- TabLayout 가져오기 : 사용할 레이아웃 객체를 정의하는 것
- addOnTabSelectedListener를 활용해서 객체를 전달
: TabLayout에 Listener를 덧붙임으로써 탭에서 '이벤트'의 발생을 감지할 수 있게된다 - OnTabSelectedListener 객체의 메소드들 재정의 : 탭에서 발생하는 정해진 '이벤트'를 받았을 때 어떻게 핸들링할지 결정
Tab 이벤트 핸들링해서 InnerFragment 띄우기
: Tab을 누르면 이전 Tab의 Fragment가 삭제되고 새로운 Tab의 Fragment를 화면(FrameLayout)에 띄운다
이전 Tab의 Fragment가 삭제된다
다른 Tab을 누르면 = 지금의 Tab 선택이 없어지면 = onTabUnselected()
기존의 Fragment가 없어지게 = .remove(FRAGMENT)
override fun onTabUnselected(tab: TabLayout.Tab?) {
childFragmentManager.beginTransaction()
.remove(childFragments[tab!!.position])
.commit()
}
새로운 Tab의 Fragment FrameLayout에 뜬다
Tab을 누르면 = onTabSelected()
Fragment가 뜨게 = .add(FRAME_LAYOUT, FRAGMENT)
override fun onTabSelected(tab: TabLayout.Tab?) {
childFragmentManager.beginTransaction()
.add(container.id, childFragments[tab!!.position])
.commit()
}
😞 ⇒ 다루고 있는 OuterFragment에서 다른 Fragment화면을 들렸다 돌아온 경우 기존에 화면에 떠있던 InnerFragment가 삭제되지 않고 중복돼있는 문제발생
문제분석: 기존 Fragment 삭제는 Tab 변환시에만 발생하므로, Tab 변환이 아닌 Fragment의 이동으로는 Fragment를 삭제시키지 못한다.
→ Fragment도 생애주기 관리가 가능하므로 이런 방식을 이용해서 처리해볼 생각이다.